// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (typeof exports == 'object' && typeof module == 'object')
    // CommonJS
    mod(require('../../lib/codemirror'), require('../haskell/haskell'));
  else if (typeof define == 'function' && define.amd)
    // AMD
    define(['../../lib/codemirror', '../haskell/haskell'], mod);
  // Plain browser env
  else mod(CodeMirror);
})(function(CodeMirror) {
  'use strict';

  CodeMirror.defineMode(
    'haskell-literate',
    function(config, parserConfig) {
      var baseMode = CodeMirror.getMode(
        config,
        (parserConfig && parserConfig.base) || 'haskell',
      );

      return {
        startState: function() {
          return {
            inCode: false,
            baseState: CodeMirror.startState(baseMode),
          };
        },
        token: function(stream, state) {
          if (stream.sol()) {
            if ((state.inCode = stream.eat('>'))) return 'meta';
          }
          if (state.inCode) {
            return baseMode.token(stream, state.baseState);
          } else {
            stream.skipToEnd();
            return 'comment';
          }
        },
        innerMode: function(state) {
          return state.inCode
            ? { state: state.baseState, mode: baseMode }
            : null;
        },
      };
    },
    'haskell',
  );

  CodeMirror.defineMIME('text/x-literate-haskell', 'haskell-literate');
});
